/* @author cerimice */
package Reportes.PDF.Entidad;

import Reportes.PDF.Formato;
import Sistema.Configuracion;
import Persistencia.Definicion.Cliente;
import Persistencia.Fachada.ListaFachada;

import java.util.Date;
import java.io.InputStream;
import java.util.logging.Logger;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import com.itextpdf.text.Element;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.vaadin.terminal.StreamResource.StreamSource;
import java.util.Collection;

public class ReporteGenerarAgendaClientes implements StreamSource
    {
    private ListaFachada                lista;
    private Formato                     formato;
    private final ByteArrayOutputStream archivoPDF;
    
    public ReporteGenerarAgendaClientes() throws Exception
        {
        lista       = new ListaFachada();
        formato     = new Formato();
        archivoPDF  = new ByteArrayOutputStream();
        this.generarReporte();
        }
    
    private void generarReporte() throws Exception
        {
        Document document = null;
        try
            {
            document = new Document(PageSize.LETTER,10,10,10,10);
            PdfWriter.getInstance(document,archivoPDF);
            document.open();
                document.add(formato.generarEncabezado("LISTADO DE CLIENTES"));
                document.add(generarTitulo());
                document.add(generarCuerpo());
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        finally
            {if (document != null){document.close();}}
        }
    
    private Paragraph generarTitulo()
        {
        Paragraph titulo = new Paragraph();
            titulo.add(new Paragraph("Fecha de creación: "+ Configuracion.getFormatoFechaLarga().format(new Date()), formato.getFuenteSubtitulo()));
            titulo.setAlignment(Element.ALIGN_CENTER);
        return titulo;
        }
    
    private Paragraph generarCuerpo() throws Exception
        {
        try
            {
            Collection<Cliente> clientes;
            Paragraph cuerpo = new Paragraph();
            for(int i=0;i<26;i++)
                {
                char inicio = (char)('a'+i);
                clientes = lista.listaCliente(1,(""+inicio).toUpperCase());
                if(!clientes.isEmpty())
                    {
                    cuerpo.add(new Paragraph((""+inicio).toUpperCase(), formato.getFuenteTitulo()));
                    PdfPTable datos     = new PdfPTable(4);
                        datos.addCell(new Paragraph("NOMBRE",formato.getFuenteSubtitulo()));
                        datos.addCell(new Paragraph("TELEFONO FIJO",formato.getFuenteSubtitulo()));
                        datos.addCell(new Paragraph("TELEFONO MOVIL",formato.getFuenteSubtitulo()));
                        datos.addCell(new Paragraph("EMAIL",formato.getFuenteSubtitulo()));
                    for(Cliente obj:clientes)
                        {
                        datos.addCell(new Paragraph(obj.getNombreCompleto(),formato.getFuenteTexto()));
                        datos.addCell(new Paragraph(obj.getTelefonoFijo(),formato.getFuenteTexto()));
                        datos.addCell(new Paragraph(obj.getTelefonoMovil(),formato.getFuenteTexto()));
                        datos.addCell(new Paragraph(obj.getEmail(),formato.getFuenteTexto()));
                        }
                    cuerpo.add(datos);
                    }
                }
            return cuerpo;
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }

    @Override
    public InputStream getStream()
        {return new ByteArrayInputStream(archivoPDF.toByteArray());}
    }
